(function() {
	var e, t, n, r, i = [].slice,
		s = {}.hasOwnProperty,
		o = function(e, t) {
			function r() {
				this.constructor = e
			}
			for (var n in t) s.call(t, n) && (e[n] = t[n]);
			return r.prototype = t.prototype, e.prototype = new r, e.__super__ = t.prototype, e
		},
		u = function(e, t) {
			return function() {
				return e.apply(t, arguments)
			}
		},
		a = [].indexOf ||
	function(e) {
		for (var t = 0, n = this.length; t < n; t++) if (t in this && this[t] === e) return t;
		return -1
	};
	t = window.Morris = {}, e = jQuery, t.EventEmitter = function() {
		function e() {}
		return e.prototype.on = function(e, t) {
			return this.handlers == null && (this.handlers = {}), this.handlers[e] == null && (this.handlers[e] = []), this.handlers[e].push(t)
		}, e.prototype.fire = function() {
			var e, t, n, r, s, o, u;
			n = arguments[0], e = 2 <= arguments.length ? i.call(arguments, 1) : [];
			if (this.handlers != null && this.handlers[n] != null) {
				o = this.handlers[n], u = [];
				for (r = 0, s = o.length; r < s; r++) t = o[r], u.push(t.apply(null, e));
				return u
			}
		}, e
	}(), t.commas = function(e) {
		var t, n, r, i;
		return e === null ? "-" : (r = e < 0 ? "-" : "", t = Math.abs(e), n = Math.floor(t).toFixed(0), r += n.replace(/(?=(?:\d{3})+$)(?!^)/g, ","), i = t.toString(), i.length > n.length && (r += i.slice(n.length)), r)
	}, t.pad2 = function(e) {
		return (e < 10 ? "0" : "") + e
	}, t.Grid = function(n) {
		function r(t) {
			typeof t.element == "string" ? this.el = e(document.getElementById(t.element)) : this.el = e(t.element);
			if (this.el === null || this.el.length === 0) throw new Error("Graph container element not found");
			this.options = e.extend({}, this.gridDefaults, this.defaults || {}, t);
			if (this.options.data === void 0 || this.options.data.length === 0) return;
			typeof this.options.units == "string" && (this.options.postUnits = t.units), this.r = new Raphael(this.el[0]), this.elementWidth = null, this.elementHeight = null, this.dirty = !1, this.init && this.init(), this.setData(this.options.data)
		}
		return o(r, n), r.prototype.gridDefaults = {
			dateFormat: null,
			gridLineColor: "#aaa",
			gridStrokeWidth: .5,
			gridTextColor: "#888",
			gridTextSize: 12,
			numLines: 5,
			padding: 25,
			parseTime: !0,
			postUnits: "",
			preUnits: "",
			ymax: "auto",
			ymin: "auto 0"
		}, r.prototype.setData = function(n, r) {
			var i, s, o = this;
			r == null && (r = !0), i = this.cumulative ? 0 : null, s = this.cumulative ? 0 : null, this.data = e.map(n, function(e, n) {
				var r, u, a, f, l;
				return u = {}, u.label = e[o.options.xkey], o.options.parseTime ? (u.x = t.parseDate(u.label), o.options.dateFormat ? u.label = o.options.dateFormat(u.x) : typeof u.label == "number" && (u.label = (new Date(u.label)).toString())) : u.x = n, a = 0, u.y = function() {
					var t, n, o, u;
					o = this.options.ykeys, u = [];
					for (r = t = 0, n = o.length; t < n; r = ++t) f = o[r], l = e[f], typeof l == "string" && (l = parseFloat(l)), typeof l != "number" && (l = null), l !== null && (this.cumulative ? a += l : i === null ? i = s = l : (i = Math.max(l, i), s = Math.min(l, s))), this.cumulative && a !== null && (i = Math.max(a, i), s = Math.min(a, s)), u.push(l);
					return u
				}.call(o), u
			}), this.options.parseTime && (this.data = this.data.sort(function(e, t) {
				return (e.x > t.x) - (t.x > e.x)
			})), this.xmin = this.data[0].x, this.xmax = this.data[this.data.length - 1].x, this.xmin === this.xmax && (this.xmin -= 1, this.xmax += 1), typeof this.options.ymax == "string" ? this.options.ymax.slice(0, 4) === "auto" ? this.options.ymax.length > 5 ? (this.ymax = parseInt(this.options.ymax.slice(5), 10), i !== null && (this.ymax = Math.max(i, this.ymax))) : this.ymax = i !== null ? i : 0 : this.ymax = parseInt(this.options.ymax, 10) : this.ymax = this.options.ymax, typeof this.options.ymin == "string" ? this.options.ymin.slice(0, 4) === "auto" ? this.options.ymin.length > 5 ? (this.ymin = parseInt(this.options.ymin.slice(5), 10), s !== null && (this.ymin = Math.min(s, this.ymin))) : this.ymin = s !== null ? s : 0 : this.ymin = parseInt(this.options.ymin, 10) : this.ymin = this.options.ymin, this.ymin === this.ymax && (s && (this.ymin -= 1), this.ymax += 1), this.yInterval = (this.ymax - this.ymin) / (this.options.numLines - 1), this.yInterval > 0 && this.yInterval < 1 ? this.precision = -Math.floor(Math.log(this.yInterval) / Math.log(10)) : this.precision = 0, this.dirty = !0;
			if (r) return this.redraw()
		}, r.prototype._calc = function() {
			var e, t, n;
			n = this.el.width(), e = this.el.height();
			if (this.elementWidth !== n || this.elementHeight !== e || this.dirty) {
				this.elementWidth = n, this.elementHeight = e, this.dirty = !1, t = Math.max(this.measureText(this.yAxisFormat(this.ymin), this.options.gridTextSize).width, this.measureText(this.yAxisFormat(this.ymax), this.options.gridTextSize).width), this.left = t + this.options.padding, this.right = this.elementWidth - this.options.padding, this.top = this.options.padding, this.bottom = this.elementHeight - this.options.padding - 1.5 * this.options.gridTextSize, this.width = this.right - this.left, this.height = this.bottom - this.top, this.dx = this.width / (this.xmax - this.xmin), this.dy = this.height / (this.ymax - this.ymin);
				if (this.calc) return this.calc()
			}
		}, r.prototype.transY = function(e) {
			return this.bottom - (e - this.ymin) * this.dy
		}, r.prototype.transX = function(e) {
			return this.data.length === 1 ? (this.left + this.right) / 2 : this.left + (e - this.xmin) * this.dx
		}, r.prototype.redraw = function() {
			this.r.clear(), this._calc(), this.drawGrid();
			if (this.draw) return this.draw()
		}, r.prototype.drawGrid = function() {
			var e, t, n, r, i, s, o, u;
			e = this.ymin, t = this.ymax, u = [];
			for (n = s = e, o = this.yInterval; e <= t ? s <= t : s >= t; n = s += o) r = parseFloat(n.toFixed(this.precision)), i = this.transY(r), this.r.text(this.left - this.options.padding / 2, i, this.yAxisFormat(r)).attr("font-size", this.options.gridTextSize).attr("fill", this.options.gridTextColor).attr("text-anchor", "end"), u.push(this.r.path("M" + this.left + "," + i + "H" + (this.left + this.width)).attr("stroke", this.options.gridLineColor).attr("stroke-width", this.options.gridStrokeWidth));
			return u
		}, r.prototype.measureText = function(e, t) {
			var n, r;
			return t == null && (t = 12), r = this.r.text(100, 100, e).attr("font-size", t), n = r.getBBox(), r.remove(), n
		}, r.prototype.yAxisFormat = function(e) {
			return this.yLabelFormat(e)
		}, r.prototype.yLabelFormat = function(e) {
			return "" + this.options.preUnits + t.commas(e) + this.options.postUnits
		}, r
	}(t.EventEmitter), t.parseDate = function(e) {
		var t, n, r, i, s, o, u, a, f, l, c;
		return typeof e == "number" ? e : (n = e.match(/^(\d+) Q(\d)$/), i = e.match(/^(\d+)-(\d+)$/), s = e.match(/^(\d+)-(\d+)-(\d+)$/), u = e.match(/^(\d+) W(\d+)$/), a = e.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/), f = e.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/), n ? (new Date(parseInt(n[1], 10), parseInt(n[2], 10) * 3 - 1, 1)).getTime() : i ? (new Date(parseInt(i[1], 10), parseInt(i[2], 10) - 1, 1)).getTime() : s ? (new Date(parseInt(s[1], 10), parseInt(s[2], 10) - 1, parseInt(s[3], 10))).getTime() : u ? (l = new Date(parseInt(u[1], 10), 0, 1), l.getDay() !== 4 && l.setMonth(0, 1 + (4 - l.getDay() + 7) % 7), l.getTime() + parseInt(u[2], 10) * 6048e5) : a ? a[6] ? (o = 0, a[6] !== "Z" && (o = parseInt(a[8], 10) * 60 + parseInt(a[9], 10), a[7] === "+" && (o = 0 - o)), Date.UTC(parseInt(a[1], 10), parseInt(a[2], 10) - 1, parseInt(a[3], 10), parseInt(a[4], 10), parseInt(a[5], 10) + o)) : (new Date(parseInt(a[1], 10), parseInt(a[2], 10) - 1, parseInt(a[3], 10), parseInt(a[4], 10), parseInt(a[5], 10))).getTime() : f ? (c = parseFloat(f[6]), t = Math.floor(c), r = Math.round((c - t) * 1e3), f[8] ? (o = 0, f[8] !== "Z" && (o = parseInt(f[10], 10) * 60 + parseInt(f[11], 10), f[9] === "+" && (o = 0 - o)), Date.UTC(parseInt(f[1], 10), parseInt(f[2], 10) - 1, parseInt(f[3], 10), parseInt(f[4], 10), parseInt(f[5], 10) + o, t, r)) : (new Date(parseInt(f[1], 10), parseInt(f[2], 10) - 1, parseInt(f[3], 10), parseInt(f[4], 10), parseInt(f[5], 10), t, r)).getTime()) : (new Date(parseInt(e, 10), 0, 1)).getTime())
	}, t.Line = function(n) {
		function r(e) {
			this.updateHilight = u(this.updateHilight, this), this.hilight = u(this.hilight, this), this.updateHover = u(this.updateHover, this);
			if (!(this instanceof t.Line)) return new t.Line(e);
			r.__super__.constructor.call(this, e)
		}
		return o(r, n), r.prototype.init = function() {
			var e, t = this;
			return this.pointGrow = Raphael.animation({
				r: this.options.pointSize + 3
			}, 25, "linear"), this.pointShrink = Raphael.animation({
				r: this.options.pointSize
			}, 25, "linear"), this.prevHilight = null, this.el.mousemove(function(e) {
				return t.updateHilight(e.pageX)
			}), this.options.hideHover && this.el.mouseout(function(e) {
				return t.hilight(null)
			}), e = function(e) {
				var n;
				return n = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0], t.updateHilight(n.pageX), n
			}, this.el.bind("touchstart", e), this.el.bind("touchmove", e), this.el.bind("touchend", e)
		}, r.prototype.defaults = {
			lineWidth: 3,
			pointSize: 4,
			lineColors: ["#0b62a4", "#7A92A3", "#4da74d", "#afd8f8", "#edc240", "#cb4b4b", "#9440ed"],
			pointWidths: [1],
			pointStrokeColors: ["#ffffff"],
			pointFillColors: [],
			hoverPaddingX: 10,
			hoverPaddingY: 5,
			hoverMargin: 10,
			hoverFillColor: "#fff",
			hoverBorderColor: "#ccc",
			hoverBorderWidth: 2,
			hoverOpacity: .95,
			hoverLabelColor: "#444",
			hoverFontSize: 12,
			smooth: !0,
			hideHover: !1,
			xLabels: "auto",
			xLabelFormat: null
		}, r.prototype.calc = function() {
			return this.calcPoints(), this.generatePaths(), this.calcHoverMargins()
		}, r.prototype.calcPoints = function() {
			var e, t, n, r, i, s;
			i = this.data, s = [];
			for (n = 0, r = i.length; n < r; n++) e = i[n], e._x = this.transX(e.x), s.push(e._y = function() {
				var n, r, i, s;
				i = e.y, s = [];
				for (n = 0, r = i.length; n < r; n++) t = i[n], t === null ? s.push(null) : s.push(this.transY(t));
				return s
			}.call(this));
			return s
		}, r.prototype.calcHoverMargins = function() {
			var t = this;
			return this.hoverMargins = e.map(this.data.slice(1), function(e, n) {
				return (e._x + t.data[n]._x) / 2
			})
		}, r.prototype.generatePaths = function() {
			var e, t, n, r;
			return this.paths = function() {
				var i, s, o, u;
				u = [];
				for (t = i = 0, s = this.options.ykeys.length; 0 <= s ? i < s : i > s; t = 0 <= s ? ++i : --i) r = this.options.smooth === !0 || (o = this.options.ykeys[t], a.call(this.options.smooth, o) >= 0), e = function() {
					var e, r, i, s;
					i = this.data, s = [];
					for (e = 0, r = i.length; e < r; e++) n = i[e], n._y[t] !== null && s.push({
						x: n._x,
						y: n._y[t]
					});
					return s
				}.call(this), e.length > 1 ? u.push(this.createPath(e, r)) : u.push(null);
				return u
			}.call(this)
		}, r.prototype.draw = function() {
			return this.drawXAxis(), this.drawSeries(), this.drawHover(), this.hilight(this.options.hideHover ? null : this.data.length - 1)
		}, r.prototype.drawXAxis = function() {
			var e, n, r, i, s, o, u, a, f, l, c = this;
			u = this.bottom + this.options.gridTextSize * 1.25, o = 50, i = null, e = function(e, t) {
				var n, r;
				return n = c.r.text(c.transX(t), u, e).attr("font-size", c.options.gridTextSize).attr("fill", c.options.gridTextColor), r = n.getBBox(), (i === null || i >= r.x + r.width) && r.x >= 0 && r.x + r.width < c.el.width() ? i = r.x - o : n.remove()
			}, this.options.parseTime ? this.data.length === 1 && this.options.xLabels === "auto" ? r = [
				[this.data[0].label, this.data[0].x]
			] : r = t.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat) : r = function() {
				var e, t, n, r;
				n = this.data, r = [];
				for (e = 0, t = n.length; e < t; e++) s = n[e], r.push([s.label, s.x]);
				return r
			}.call(this), r.reverse(), l = [];
			for (a = 0, f = r.length; a < f; a++) n = r[a], l.push(e(n[0], n[1]));
			return l
		}, r.prototype.drawSeries = function() {
			var e, t, n, r, i, s, o, u, a;
			for (t = i = o = this.options.ykeys.length - 1; o <= 0 ? i <= 0 : i >= 0; t = o <= 0 ? ++i : --i) n = this.paths[t], n !== null && this.r.path(n).attr("stroke", this.colorForSeries(t)).attr("stroke-width", this.options.lineWidth);
			this.seriesPoints = function() {
				var e, n, r;
				r = [];
				for (t = e = 0, n = this.options.ykeys.length; 0 <= n ? e < n : e > n; t = 0 <= n ? ++e : --e) r.push([]);
				return r
			}.call(this), a = [];
			for (t = s = u = this.options.ykeys.length - 1; u <= 0 ? s <= 0 : s >= 0; t = u <= 0 ? ++s : --s) a.push(function() {
				var n, i, s, o;
				s = this.data, o = [];
				for (n = 0, i = s.length; n < i; n++) r = s[n], r._y[t] === null ? e = null : e = this.r.circle(r._x, r._y[t], this.options.pointSize).attr("fill", this.pointFillColorForSeries(t) || this.colorForSeries(t)).attr("stroke-width", this.strokeWidthForSeries(t)).attr("stroke", this.strokeForSeries(t)), o.push(this.seriesPoints[t].push(e));
				return o
			}.call(this));
			return a
		}, r.prototype.createPath = function(t, n) {
			var r, i, s, o, u, a, f, l, c, h, p, d, v, m;
			l = "";
			if (n) {
				s = this.gradients(t);
				for (o = v = 0, m = t.length - 1; 0 <= m ? v <= m : v >= m; o = 0 <= m ? ++v : --v) r = t[o], o === 0 ? l += "M" + r.x + "," + r.y : (i = s[o], a = t[o - 1], f = s[o - 1], u = (r.x - a.x) / 4, c = a.x + u, p = Math.min(this.bottom, a.y + u * f), h = r.x - u, d = Math.min(this.bottom, r.y - u * i), l += "C" + c + "," + p + "," + h + "," + d + "," + r.x + "," + r.y)
			} else l = "M" + e.map(t, function(e) {
				return "" + e.x + "," + e.y
			}).join("L");
			return l
		}, r.prototype.gradients = function(t) {
			return e.map(t, function(e, n) {
				return n === 0 ? (t[1].y - e.y) / (t[1].x - e.x) : n === t.length - 1 ? (e.y - t[n - 1].y) / (e.x - t[n - 1].x) : (t[n + 1].y - t[n - 1].y) / (t[n + 1].x - t[n - 1].x)
			})
		}, r.prototype.drawHover = function() {
			var e, t, n, r, i, s;
			this.hoverHeight = this.options.hoverFontSize * 1.5 * (this.options.ykeys.length + 1), this.hover = this.r.rect(-10, -this.hoverHeight / 2 - this.options.hoverPaddingY, 20, this.hoverHeight + this.options.hoverPaddingY * 2, 10).attr("fill", this.options.hoverFillColor).attr("stroke", this.options.hoverBorderColor).attr("stroke-width", this.options.hoverBorderWidth).attr("opacity", this.options.hoverOpacity), this.xLabel = this.r.text(0, this.options.hoverFontSize * .75 - this.hoverHeight / 2, "").attr("fill", this.options.hoverLabelColor).attr("font-weight", "bold").attr("font-size", this.options.hoverFontSize), this.hoverSet = this.r.set(), this.hoverSet.push(this.hover), this.hoverSet.push(this.xLabel), this.yLabels = [], s = [];
			for (e = r = 0, i = this.options.ykeys.length; 0 <= i ? r < i : r > i; e = 0 <= i ? ++r : --r) t = this.cumulative ? this.options.ykeys.length - e - 1 : e, n = this.r.text(0, this.options.hoverFontSize * 1.5 * (t + 1.5) - this.hoverHeight / 2, "").attr("fill", this.colorForSeries(e)).attr("font-size", this.options.hoverFontSize), this.yLabels.push(n), s.push(this.hoverSet.push(n));
			return s
		}, r.prototype.updateHover = function(t) {
			var n, r, i, s, o, u, a, f, l;
			this.hoverSet.show(), i = this.data[t], this.xLabel.attr("text", i.label), l = i.y;
			for (n = a = 0, f = l.length; a < f; n = ++a) o = l[n], this.yLabels[n].attr("text", "" + this.options.labels[n] + ": " + this.yLabelFormat(o));
			return r = Math.max.apply(null, e.map(this.yLabels, function(e) {
				return e.getBBox().width
			})), r = Math.max(r, this.xLabel.getBBox().width), this.hover.attr("width", r + this.options.hoverPaddingX * 2), this.hover.attr("x", -this.options.hoverPaddingX - r / 2), u = Math.min.apply(null, function() {
				var e, t, n, r;
				n = i._y, r = [];
				for (e = 0, t = n.length; e < t; e++) o = n[e], o !== null && r.push(o);
				return r
			}().concat(this.bottom)), u > this.hoverHeight + this.options.hoverPaddingY * 2 + this.options.hoverMargin + this.top ? u = u - this.hoverHeight / 2 - this.options.hoverPaddingY - this.options.hoverMargin : u = u + this.hoverHeight / 2 + this.options.hoverPaddingY + this.options.hoverMargin, u = Math.max(this.top + this.hoverHeight / 2 + this.options.hoverPaddingY, u), u = Math.min(this.bottom - this.hoverHeight / 2 - this.options.hoverPaddingY, u), s = Math.min(this.right - r / 2 - this.options.hoverPaddingX, this.data[t]._x), s = Math.max(this.left + r / 2 + this.options.hoverPaddingX, s), this.hoverSet.attr("transform", "t" + s + "," + u)
		}, r.prototype.hideHover = function() {
			return this.hoverSet.hide()
		}, r.prototype.hilight = function(e) {
			var t, n, r, i, s;
			if (this.prevHilight !== null && this.prevHilight !== e) for (t = n = 0, i = this.seriesPoints.length - 1; 0 <= i ? n <= i : n >= i; t = 0 <= i ? ++n : --n) this.seriesPoints[t][this.prevHilight] && this.seriesPoints[t][this.prevHilight].animate(this.pointShrink);
			if (e !== null && this.prevHilight !== e) {
				for (t = r = 0, s = this.seriesPoints.length - 1; 0 <= s ? r <= s : r >= s; t = 0 <= s ? ++r : --r) this.seriesPoints[t][e] && this.seriesPoints[t][e].animate(this.pointGrow);
				this.updateHover(e)
			}
			this.prevHilight = e;
			if (e === null) return this.hideHover()
		}, r.prototype.updateHilight = function(e) {
			var t, n, r;
			e -= this.el.offset().left;
			for (t = n = 0, r = this.hoverMargins.length; 0 <= r ? n < r : n > r; t = 0 <= r ? ++n : --n) if (this.hoverMargins[t] > e) break;
			return this.hilight(t)
		}, r.prototype.colorForSeries = function(e) {
			return this.options.lineColors[e % this.options.lineColors.length]
		}, r.prototype.strokeWidthForSeries = function(e) {
			return this.options.pointWidths[e % this.options.pointWidths.length]
		}, r.prototype.strokeForSeries = function(e) {
			return this.options.pointStrokeColors[e % this.options.pointStrokeColors.length]
		}, r.prototype.pointFillColorForSeries = function(e) {
			return this.options.pointFillColors[e % this.options.pointFillColors.length]
		}, r
	}(t.Grid), t.labelSeries = function(n, r, i, s, o) {
		var u, a, f, l, c, h, p, d, v, m, g;
		f = 200 * (r - n) / i, a = new Date(n), p = t.LABEL_SPECS[s];
		if (p === void 0) {
			g = t.AUTO_LABEL_ORDER;
			for (v = 0, m = g.length; v < m; v++) {
				l = g[v], h = t.LABEL_SPECS[l];
				if (f >= h.span) {
					p = h;
					break
				}
			}
		}
		p === void 0 && (p = t.LABEL_SPECS.second), o && (p = e.extend({}, p, {
			fmt: o
		})), u = p.start(a), c = [];
		while ((d = u.getTime()) <= r) d >= n && c.push([p.fmt(u), d]), p.incr(u);
		return c
	}, n = function(e) {
		return {
			span: e * 60 * 1e3,
			start: function(e) {
				return new Date(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours())
			},
			fmt: function(e) {
				return "" + t.pad2(e.getHours()) + ":" + t.pad2(e.getMinutes())
			},
			incr: function(t) {
				return t.setMinutes(t.getMinutes() + e)
			}
		}
	}, r = function(e) {
		return {
			span: e * 1e3,
			start: function(e) {
				return new Date(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes())
			},
			fmt: function(e) {
				return "" + t.pad2(e.getHours()) + ":" + t.pad2(e.getMinutes()) + ":" + t.pad2(e.getSeconds())
			},
			incr: function(t) {
				return t.setSeconds(t.getSeconds() + e)
			}
		}
	}, t.LABEL_SPECS = {
		year: {
			span: 1728e7,
			start: function(e) {
				return new Date(e.getFullYear(), 0, 1)
			},
			fmt: function(e) {
				return "" + e.getFullYear()
			},
			incr: function(e) {
				return e.setFullYear(e.getFullYear() + 1)
			}
		},
		month: {
			span: 24192e5,
			start: function(e) {
				return new Date(e.getFullYear(), e.getMonth(), 1)
			},
			fmt: function(e) {
				return "" + e.getFullYear() + "-" + t.pad2(e.getMonth() + 1)
			},
			incr: function(e) {
				return e.setMonth(e.getMonth() + 1)
			}
		},
		day: {
			span: 864e5,
			start: function(e) {
				return new Date(e.getFullYear(), e.getMonth(), e.getDate())
			},
			fmt: function(e) {
				return "" + e.getFullYear() + "-" + t.pad2(e.getMonth() + 1) + "-" + t.pad2(e.getDate())
			},
			incr: function(e) {
				return e.setDate(e.getDate() + 1)
			}
		},
		hour: n(60),
		"30min": n(30),
		"15min": n(15),
		"10min": n(10),
		"5min": n(5),
		minute: n(1),
		"30sec": r(30),
		"15sec": r(15),
		"10sec": r(10),
		"5sec": r(5),
		second: r(1)
	}, t.AUTO_LABEL_ORDER = ["year", "month", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"], t.Area = function(e) {
		function n(e) {
			if (!(this instanceof t.Area)) return new t.Area(e);
			this.cumulative = !0, n.__super__.constructor.call(this, e)
		}
		return o(n, e), n.prototype.calcPoints = function() {
			var e, t, n, r, i, s, o;
			s = this.data, o = [];
			for (r = 0, i = s.length; r < i; r++) e = s[r], e._x = this.transX(e.x), t = 0, o.push(e._y = function() {
				var r, i, s, o;
				s = e.y, o = [];
				for (r = 0, i = s.length; r < i; r++) n = s[r], t += n || 0, o.push(this.transY(t));
				return o
			}.call(this));
			return o
		}, n.prototype.drawSeries = function() {
			var e, t, r, i;
			for (e = r = i = this.options.ykeys.length - 1; i <= 0 ? r <= 0 : r >= 0; e = i <= 0 ? ++r : --r) t = this.paths[e], t !== null && (t += "L" + this.transX(this.xmax) + "," + this.bottom + "L" + this.transX(this.xmin) + "," + this.bottom + "Z", this.r.path(t).attr("fill", this.fillForSeries(e)).attr("stroke-width", 0));
			return n.__super__.drawSeries.call(this)
		}, n.prototype.fillForSeries = function(e) {
			var t;
			return t = Raphael.rgb2hsl(this.colorForSeries(e)), Raphael.hsl(t.h, Math.min(255, t.s * .75), Math.min(255, t.l * 1.25))
		}, n
	}(t.Line), t.Bar = function(n) {
		function r(n) {
			this.updateHilight = u(this.updateHilight, this), this.hilight = u(this.hilight, this), this.updateHover = u(this.updateHover, this);
			if (!(this instanceof t.Bar)) return new t.Bar(n);
			r.__super__.constructor.call(this, e.extend({}, n, {
				parseTime: !1
			}))
		}
		return o(r, n), r.prototype.init = function() {
			var e, t = this;
			return this.prevHilight = null, this.el.mousemove(function(e) {
				return t.updateHilight(e.pageX)
			}), this.options.hideHover && this.el.mouseout(function(e) {
				return t.hilight(null)
			}), e = function(e) {
				var n;
				return n = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0], t.updateHilight(n.pageX), n
			}, this.el.bind("touchstart", e), this.el.bind("touchmove", e), this.el.bind("touchend", e)
		}, r.prototype.defaults = {
			barSizeRatio: .75,
			barGap: 3,
			barColors: ["#0b62a4", "#7a92a3", "#4da74d", "#afd8f8", "#edc240", "#cb4b4b", "#9440ed"],
			hoverPaddingX: 10,
			hoverPaddingY: 5,
			hoverMargin: 10,
			hoverFillColor: "#fff",
			hoverBorderColor: "#ccc",
			hoverBorderWidth: 2,
			hoverOpacity: .95,
			hoverLabelColor: "#444",
			hoverFontSize: 12,
			hideHover: !1
		}, r.prototype.calc = function() {
			return this.calcBars(), this.calcHoverMargins()
		}, r.prototype.calcBars = function() {
			var e, t, n, r, i, s, o;
			s = this.data, o = [];
			for (e = r = 0, i = s.length; r < i; e = ++r) t = s[e], t._x = this.left + this.width * (e + .5) / this.data.length, o.push(t._y = function() {
				var e, r, i, s;
				i = t.y, s = [];
				for (e = 0, r = i.length; e < r; e++) n = i[e], n === null ? s.push(null) : s.push(this.transY(n));
				return s
			}.call(this));
			return o
		}, r.prototype.calcHoverMargins = function() {
			var e;
			return this.hoverMargins = function() {
				var t, n, r;
				r = [];
				for (e = t = 1, n = this.data.length; 1 <= n ? t < n : t > n; e = 1 <= n ? ++t : --t) r.push(this.left + e * this.width / this.data.length);
				return r
			}.call(this)
		}, r.prototype.draw = function() {
			return this.drawXAxis(), this.drawSeries(), this.drawHover(), this.hilight(this.options.hideHover ? null : this.data.length - 1)
		}, r.prototype.drawXAxis = function() {
			var e, t, n, r, i, s, o, u, a, f;
			o = this.bottom + this.options.gridTextSize * 1.25, s = 50, r = null, f = [];
			for (e = u = 0, a = this.data.length; 0 <= a ? u < a : u > a; e = 0 <= a ? ++u : --u) i = this.data[this.data.length - 1 - e], t = this.r.text(i._x, o, i.label).attr("font-size", this.options.gridTextSize).attr("fill", this.options.gridTextColor), n = t.getBBox(), (r === null || r >= n.x + n.width) && n.x >= 0 && n.x + n.width < this.el.width() ? f.push(r = n.x - s) : f.push(t.remove());
			return f
		}, r.prototype.drawSeries = function() {
			var e, t, n, r, i, s, o, u, a, f, l, c;
			return n = this.width / this.options.data.length, o = this.options.ykeys.length, e = (n * this.options.barSizeRatio - this.options.barGap * (o - 1)) / o, s = n * (1 - this.options.barSizeRatio) / 2, c = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null, this.bars = function() {
				var o, h, p, d;
				p = this.data, d = [];
				for (r = o = 0, h = p.length; o < h; r = ++o) u = p[r], d.push(function() {
					var o, h, p, d;
					p = u._y, d = [];
					for (a = o = 0, h = p.length; o < h; a = ++o) l = p[a], l !== null ? (c ? (f = Math.min(l, c), t = Math.max(l, c)) : (f = l, t = this.bottom), i = this.left + r * n + s + a * (e + this.options.barGap), d.push(this.r.rect(i, f, e, t - f).attr("fill", this.options.barColors[a % this.options.barColors.length]).attr("stroke-width", 0))) : d.push(null);
					return d
				}.call(this));
				return d
			}.call(this)
		}, r.prototype.drawHover = function() {
			var e, t, n, r, i;
			this.hoverHeight = this.options.hoverFontSize * 1.5 * (this.options.ykeys.length + 1), this.hover = this.r.rect(-10, -this.hoverHeight / 2 - this.options.hoverPaddingY, 20, this.hoverHeight + this.options.hoverPaddingY * 2, 10).attr("fill", this.options.hoverFillColor).attr("stroke", this.options.hoverBorderColor).attr("stroke-width", this.options.hoverBorderWidth).attr("opacity", this.options.hoverOpacity), this.xLabel = this.r.text(0, this.options.hoverFontSize * .75 - this.hoverHeight / 2, "").attr("fill", this.options.hoverLabelColor).attr("font-weight", "bold").attr("font-size", this.options.hoverFontSize), this.hoverSet = this.r.set(), this.hoverSet.push(this.hover), this.hoverSet.push(this.xLabel), this.yLabels = [], i = [];
			for (e = n = 0, r = this.options.ykeys.length; 0 <= r ? n < r : n > r; e = 0 <= r ? ++n : --n) t = this.r.text(0, this.options.hoverFontSize * 1.5 * (e + 1.5) - this.hoverHeight / 2, "").attr("font-size", this.options.hoverFontSize), this.yLabels.push(t), i.push(this.hoverSet.push(t));
			return i
		}, r.prototype.updateHover = function(t) {
			var n, r, i, s, o, u, a, f, l;
			this.hoverSet.show(), i = this.data[t], this.xLabel.attr("text", i.label), l = i.y;
			for (n = a = 0, f = l.length; a < f; n = ++a) o = l[n], this.yLabels[n].attr("fill", this.options.barColors[n % this.options.barColors.length]), this.yLabels[n].attr("text", "" + this.options.labels[n] + ": " + this.yLabelFormat(o));
			return r = Math.max.apply(null, e.map(this.yLabels, function(e) {
				return e.getBBox().width
			})), r = Math.max(r, this.xLabel.getBBox().width), this.hover.attr("width", r + this.options.hoverPaddingX * 2), this.hover.attr("x", -this.options.hoverPaddingX - r / 2), u = (this.bottom + this.top) / 2, s = Math.min(this.right - r / 2 - this.options.hoverPaddingX, this.data[t]._x), s = Math.max(this.left + r / 2 + this.options.hoverPaddingX, s), this.hoverSet.attr("transform", "t" + s + "," + u)
		}, r.prototype.hideHover = function() {
			return this.hoverSet.hide()
		}, r.prototype.hilight = function(e) {
			e !== null && this.prevHilight !== e && this.updateHover(e), this.prevHilight = e;
			if (e === null) return this.hideHover()
		}, r.prototype.updateHilight = function(e) {
			var t, n, r;
			e -= this.el.offset().left;
			for (t = n = 0, r = this.hoverMargins.length; 0 <= r ? n < r : n > r; t = 0 <= r ? ++n : --n) if (this.hoverMargins[t] > e) break;
			return this.hilight(t)
		}, r
	}(t.Grid), t.Donut = function() {
		function n(n) {
			this.select = u(this.select, this);
			if (!(this instanceof t.Donut)) return new t.Donut(n);
			typeof n.element == "string" ? this.el = e(document.getElementById(n.element)) : this.el = e(n.element), this.options = e.extend({}, this.defaults, n);
			if (this.el === null || this.el.length === 0) throw new Error("Graph placeholder not found.");
			if (n.data === void 0 || n.data.length === 0) return;
			this.data = n.data, this.el.addClass("graph-initialised"), this.redraw()
		}
		return n.prototype.defaults = {
			colors: ["#0B62A4", "#3980B5", "#679DC6", "#95BBD7", "#B0CCE1", "#095791", "#095085", "#083E67", "#052C48", "#042135"],
			formatter: t.commas
		}, n.prototype.redraw = function() {
			var e, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w, E, S, x;
			this.el.empty(), this.r = new Raphael(this.el[0]), n = this.el.width() / 2, r = this.el.height() / 2, h = (Math.min(n, r) - 10) / 3, c = 0, w = this.data;
			for (d = 0, g = w.length; d < g; d++) p = w[d], c += p.value;
			a = 5 / (2 * h), e = 1.9999 * Math.PI - a * this.data.length, o = 0, s = 0, this.segments = [], E = this.data;
			for (v = 0, y = E.length; v < y; v++) i = E[v], f = o + a + e * (i.value / c), l = new t.DonutSegment(n, r, h * 2, h, o, f, this.options.colors[s % this.options.colors.length], i), l.render(this.r), this.segments.push(l), l.on("hover", this.select), o = f, s += 1;
			this.text1 = this.r.text(n, r - 10, "").attr({
				"font-size": 15,
				"font-weight": 800
			}), this.text2 = this.r.text(n, r + 10, "").attr({
				"font-size": 14
			}), u = Math.max.apply(null, function() {
				var e, t, n, r;
				n = this.data, r = [];
				for (e = 0, t = n.length; e < t; e++) i = n[e], r.push(i.value);
				return r
			}.call(this)), s = 0, S = this.data, x = [];
			for (m = 0, b = S.length; m < b; m++) {
				i = S[m];
				if (i.value === u) {
					this.select(s);
					break
				}
				x.push(s += 1)
			}
			return x
		}, n.prototype.select = function(e) {
			var t, n, r, i, s;
			s = this.segments;
			for (r = 0, i = s.length; r < i; r++) t = s[r], t.deselect();
			return typeof e == "number" ? n = this.segments[e] : n = e, n.select(), this.setLabels(n.data.label, this.options.formatter(n.data.value))
		}, n.prototype.setLabels = function(e, t) {
			var n, r, i, s, o, u, a, f;
			return n = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3, s = 1.8 * n, i = n / 2, r = n / 3, this.text1.attr({
				text: e,
				transform: ""
			}), o = this.text1.getBBox(), u = Math.min(s / o.width, i / o.height), this.text1.attr({
				transform: "S" + u + "," + u + "," + (o.x + o.width / 2) + "," + (o.y + o.height)
			}), this.text2.attr({
				text: t,
				transform: ""
			}), a = this.text2.getBBox(), f = Math.min(s / a.width, r / a.height), this.text2.attr({
				transform: "S" + f + "," + f + "," + (a.x + a.width / 2) + "," + a.y
			})
		}, n
	}(), t.DonutSegment = function(e) {
		function t(e, t, n, r, i, s, o, a) {
			this.cx = e, this.cy = t, this.inner = n, this.outer = r, this.color = o, this.data = a, this.deselect = u(this.deselect, this), this.select = u(this.select, this), this.sin_p0 = Math.sin(i), this.cos_p0 = Math.cos(i), this.sin_p1 = Math.sin(s), this.cos_p1 = Math.cos(s), this.long = s - i > Math.PI ? 1 : 0, this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5), this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer), this.hilight = this.calcArc(this.inner)
		}
		return o(t, e), t.prototype.calcArcPoints = function(e) {
			return [this.cx + e * this.sin_p0, this.cy + e * this.cos_p0, this.cx + e * this.sin_p1, this.cy + e * this.cos_p1]
		}, t.prototype.calcSegment = function(e, t) {
			var n, r, i, s, o, u, a, f, l, c;
			return l = this.calcArcPoints(e), n = l[0], i = l[1], r = l[2], s = l[3], c = this.calcArcPoints(t), o = c[0], a = c[1], u = c[2], f = c[3], "M" + n + "," + i + ("A" + e + "," + e + ",0," + this.long + ",0," + r + "," + s) + ("L" + u + "," + f) + ("A" + t + "," + t + ",0," + this.long + ",1," + o + "," + a) + "Z"
		}, t.prototype.calcArc = function(e) {
			var t, n, r, i, s;
			return s = this.calcArcPoints(e), t = s[0], r = s[1], n = s[2], i = s[3], "M" + t + "," + r + ("A" + e + "," + e + ",0," + this.long + ",0," + n + "," + i)
		}, t.prototype.render = function(e) {
			var t = this;
			return this.arc = e.path(this.hilight).attr({
				stroke: this.color,
				"stroke-width": 2,
				opacity: 0
			}), this.seg = e.path(this.path).attr({
				fill: this.color,
				stroke: "white",
				"stroke-width": 3
			}).hover(function() {
				return t.fire("hover", t)
			})
		}, t.prototype.select = function() {
			if (!this.selected) return this.seg.animate({
				path: this.selectedPath
			}, 150, "<>"), this.arc.animate({
				opacity: 1
			}, 150, "<>"), this.selected = !0
		}, t.prototype.deselect = function() {
			if (this.selected) return this.seg.animate({
				path: this.path
			}, 150, "<>"), this.arc.animate({
				opacity: 0
			}, 150, "<>"), this.selected = !1
		}, t
	}(t.EventEmitter)
}).call(this);